import time
# 变量类型和运算符

# 整型
a = 5
print(a)
print(type(a))

# 字符
a = "hello"
print(a)
print(type(a))

# 浮点
a = 999999999999999999999999999999999999
print(type(a))

#以0x或0X开头的整型数值是十六进制形式的整数
hex_value1 = 0x13
hex_value2 = 0xaF
print("hexValue1 的值为：",hex_value1)
print("hexValue2 的值为：",hex_value2)
#以0b或0B开头的整型数值是二进制形式的整数
bin_val = 0b011
print('bin_val的值为：',bin_val)
bin_val = 0B101
print('bin_val的值为：',bin_val)
#以0o或0O开头的整型数值是八进制形式的整数
oct_val = 0o54
print('oct_val 的值为：',oct_val)
oct_val = 0O17
print('oct_val 的值为：',oct_val)


# 在数值中使用下画线
one_million = 1000000
print(one_million)
price = 234_234_234 #price 实际的值为234234234
android = 1234_1234 #android 实际的值为12341234
print(price)

af1 = 5.2345556
# 输出af1的值
print("af1的值为：",af1)
af2 = 25.2345
print("af2的类型为：",type(af2))
f1=5.12e2
print("f1的值为：",f1)
f2 = 5e3
print("f2的值为：",f2)
print("f2的类型为：",type(f2))
# 看到类型为float

print(0.1 + 0.2)

# 如果希望将一个字符串转换成 bytes 对象，有如下三种方式：
# 如果字符串内容都是 ASCII 字符，则可以通过直接在字符串之前添加 b 来构建字节串值。
# 调用 bytes() 函数（其实是 bytes 的构造方法）将字符串按指定字符集转换成字节串，如果不指定字符集，默认使用 UTF-8 字符集。
# 调用字符串本身的 encode() 方法将字符串按指定字符集转换成字节串，如果不指定字符集，默认使用 UTF-8 字符集。

b1 = b'a'
print(b1[0])
b2 = bytes("abc", encoding="utf-8")
print(b2[0:3])
print(type(b2))
b3 = "很爱很爱你".encode()
print(b3)
print(type(b3))

print(b3.decode("utf-8"))

# True 和 False 是 Python 中的关键字，当作为 Python 代码输入时，一定要注意字母的大小写，否则解释器会报错。
# 布尔类型可以当做整数来对待，即 True 相当于整数值 1，False 相当于整数值 0。
print(True + 10)
print(False - 2)

result = 100 > 50
print(result)
print(type(result))

# input获取用户输入值
#inputStr = input("enter str:")
#print(inputStr)
#print(type(inputStr))

# print高级用法
print("今天是", "星期五", end="")
print("分割是", "什么", sep="|", end="P")
print("测试")

# print到文件
# file = open("log.txt", mode="w")
# print("我要写入到文件", file= file )
# file.close()

# 格式化字符串
print("我今年%s岁了" % 15)
print("我的名字叫%s，今年%s岁了" % ("tome", 15))
num = -28
print("num is: %i" % num)
print("num is: %6d" % num)
print("num is: %6o" % num)
print("num is: %6x" % num)
print("num is: %6X" % num)
print("num is: %6s" % num)
print("a ascii code is  %c" % 97)
num2 = 30
# 最小宽度为0，左边补0
print("num2 is: %06d" % num2)
# 最小宽度为6，左边补0，总带上符号
print("num2 is: %+06d" % num2)
# 最小宽度为6，右对齐
print("num2 is: %-6d" % num2)
my_value = 3.001415926535
# 最小宽度为8，小数点后保留3位
print("my_value is: %8.3f" % my_value)
# 最小宽度为8，小数点后保留3位，左边补0
print("my_value is: %08.3f" % my_value)
# 最小宽度为8，小数点后保留3位，左边补0，始终带符号
print("my_value is: %+08.3f" % my_value)
the_name = "Charlie"
# 只保留3个字符
print("the name is: %.3s" % the_name) # 输出Cha
# 只保留2个字符，最小宽度10
print("the name is: %10.2s" % the_name)

# 转义字符
print("\'A\' is \'a\'")
print("我想说的是\"我爱你\"")
print("斜杠是\\")
print("换行\n已经换了")
print("A\0\0\0\0A")

# 数据类型转换
# 虽然 Python 是弱类型编程语言，不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型，但在一些特定场景中，仍然需要用到类型转换。

# 解释器提示我们字符串和浮点类型变量不能直接相连，需要提前将浮点类型变量 height 转换为字符串才可以。
# TypeError: can only concatenate str (not "float") to str
height = 173.9
print("身高是" + str(height))
heightInt = int(height)
print(heightInt)
print(type(heightInt))

# 运算符
x1 = 10
x2 = 3
print(x1 / x2)
print(x1 // x2)
print(x1 % x2)
print(2 ** 2)
print(x1 >> 1)
print(4 << 2)

# id函数获取变量引用的内存地址
y1 = 10
y2 = 10
print(y1 == y2)
print(y1 is y2)
print(id(y1))
print(id(y2))
z1 = "哈哈"
z2 = "哈哈";
print(z1 == z2)
print(z1 is z2)
print(id(z1))
print(id(z2))

t1 = time.gmtime()
t2 = time.gmtime()
print(t1 is t2)
print(t1 is not t2)
print(id(t1))
print(id(t2))
print(t1)

# 逻辑运算符 and or not
print(not 1 == 1)
if 1 == 1 and 2 == 2:
    print("and")
if 1 == 1 or 1 == 2:
    print("or")
# 三目运算
p = 100 if 100 > 99 else 99
print(p)